package miniprojet;

import java.io.IOException;
import java.util.Collection;

import javax.ejb.EJB;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import miniprojet.jeux.modele.Administrateur;
import miniprojet.jeux.modele.Arbitre;
import miniprojet.jeux.modele.But;
import miniprojet.jeux.modele.Etat;
import miniprojet.jeux.modele.Joueur;
import miniprojet.jeux.modele.Match;
import miniprojet.jeux.modele.Tour;
import miniprojet.jeux.stateless.TournoiLocal;

/**
 * 
 * Servlet partie administration (gestion arbitre et rencontres)
 * 
 */
@WebServlet("/administration")
public class AdministrateurServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@EJB
	TournoiLocal tournoi;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public AdministrateurServlet() {
		super();
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String action = request.getParameter("action");
		RequestDispatcher dispatcher = null;
		if (action != null) {
			// Démarrage du tournoi
			if (action.equals("demarrerTournoi")) {
				tournoi.demarrerTournoi();
				Collection<Tour> tours = tournoi.getToursDesc();
				request.getSession().setAttribute("tours", tours);
				request.getSession().setAttribute("equipes",
						tournoi.getAllEquipes());
				dispatcher = request
						.getRequestDispatcher("/administration/rencontres.jsp");
			}
			// Tentative de login admin
			if (action.equals("loginAdministration")) {
				String login = request.getParameter("tbLogin");
				String pwd = request.getParameter("tbPassword");
				Administrateur admin = tournoi.authentifierAdministrateur(
						login, pwd);
				if (admin != null) { // authentification reussie
					request.getSession().setAttribute("admin", admin);
					dispatcher = request.getRequestDispatcher("/miniprojet");
				} else { // authentification echoue
					request.getSession().setAttribute("admin", null);
					String erreur = "";
					if (login.equals("") || pwd.equals("")) {
						erreur = "Champ(s) obligatoire(s) manquant(s)";
					} else {
						erreur = "Login ou mot de passe incorrect";
					}
					dispatcher = request
							.getRequestDispatcher("/administration/login.jsp?erreur="
									+ erreur);
				}
			}
			// Deconnexion de l'admin
			else if (action.equals("deconnexion")) {
				request.getSession().setAttribute("admin", null);
				dispatcher = request.getRequestDispatcher("/miniprojet");
			}
			// Affichage liste des arbitres
			else if (action.equals("listeArbitres")) {
				request.setAttribute("arbitres", tournoi.getAllArbitres());
				dispatcher = request
						.getRequestDispatcher("/administration/arbitres.jsp");
			}
			// Edition d'un arbitre
			else if (action.equals("editionArbitre")) {
				if (request.getParameter("id") != null) {
					Arbitre a = tournoi.getArbitre(Integer.parseInt(request
							.getParameter("id")));
					if (a != null) {
						request.getSession().setAttribute("editionArbitre", a);
					}
				}
				dispatcher = request
						.getRequestDispatcher("/administration/editionArbitre.jsp");
			}
			// Suppression d'un arbitre
			else if (action.equals("suppressionArbitre")) {
				if (request.getParameter("id") != null) {
					tournoi.deleteArbitre(Integer.parseInt(request
							.getParameter("id")));
				}
				request.setAttribute("arbitres", tournoi.getAllArbitres());
				dispatcher = request
						.getRequestDispatcher("/administration/arbitres.jsp");
			}
			// Sauvegarde d'un arbitre (INSERT ou UPDATE)
			else if (action.equals("saveArbitre")) {
				// Mode édition arbitre existant
				if (request.getParameter("id") != null) {
					Arbitre a = tournoi.getArbitre(Integer.parseInt(request
							.getParameter("id")));
					if (a != null) {
						String nom = request.getParameter("tbNomArbitre");
						String prenom = request.getParameter("tbPrenomArbitre");
						a.setNom(nom);
						a.setPrenom(prenom);
						tournoi.setArbitre(a);
						request.getSession().setAttribute("editionArbitre", a);
						dispatcher = request
								.getRequestDispatcher("/administration/editionArbitre.jsp?success=Arbitre modifié");
					}
				}
				// Mode ajout d'un nouvel arbitre
				else {
					String nom = request.getParameter("tbNomArbitre");
					String prenom = request.getParameter("tbPrenomArbitre");
					if (!nom.equals("") && !prenom.equals("")) {
						Arbitre a = new Arbitre();
						a.setNom(nom);
						a.setPrenom(prenom);
						tournoi.addArbitre(a);
						request.getSession().setAttribute("editionArbitre", a);
						dispatcher = request
								.getRequestDispatcher("/administration/editionArbitre.jsp?success=Arbitre ajouté");
					} else {
						dispatcher = request
								.getRequestDispatcher("/administration/editionArbitre.jsp?error=Champ(s) obligatoire(s) manquant(s)");
					}
				}
			}
			// Affichage de la liste des matchs
			else if (action.equals("listeRencontres")) {
				Collection<Tour> tours = tournoi.getToursDesc();
				request.getSession().setAttribute("tours", tours);
				request.getSession().setAttribute("equipes",
						tournoi.getAllEquipes());
				dispatcher = request
						.getRequestDispatcher("/administration/rencontres.jsp");
			}
			// Edition d'un match
			else if (action.equals("editMatch")) {
				if (request.getParameter("id") != null) {
					Match m = tournoi.getMatch((Integer.parseInt(request
							.getParameter("id"))));
					if (m != null) {
						request.setAttribute("match", m);
						request.setAttribute("arbitres",
								tournoi.getAllArbitresDisponible());
						dispatcher = request
								.getRequestDispatcher("/administration/match.jsp");
					}
				}
			}
			// Affectation d'un arbitre
			else if (action.equals("affectationArbitreMatch")) {
				if (request.getParameter("idMatch") != null) {
					Match m = tournoi.getMatch((Integer.parseInt(request
							.getParameter("idMatch"))));
					if (m != null) {
						if (request.getParameter("idArbitre") != null) {
							Arbitre a = tournoi
									.getArbitre((Integer.parseInt(request
											.getParameter("idArbitre"))));
							if (a != null) {
								m.setArbitre(a);
								tournoi.setMatch(m);
							}
						}
						request.setAttribute("match", m);
						request.setAttribute("arbitres",
								tournoi.getAllArbitresDisponible());
						dispatcher = request
								.getRequestDispatcher("/administration/match.jsp");
					}
				}
			}
			// Lancer un match
			else if (action.equals("demarrerMatch")) {
				if (request.getParameter("id") != null) {
					Match m = tournoi.getMatch((Integer.parseInt(request
							.getParameter("id"))));
					if (m != null) {
						m.setEtat(Etat.EnCours);
						tournoi.setMatch(m);
						request.setAttribute("match", m);
						request.setAttribute("arbitres",
								tournoi.getAllArbitresDisponible());
						dispatcher = request
								.getRequestDispatcher("/administration/match.jsp");
					}
				}
			}
			// Terminer un match
			else if (action.equals("terminerMatch")) {
				if (request.getParameter("id") != null) {
					Match m = tournoi.getMatch((Integer.parseInt(request
							.getParameter("id"))));
					if (m != null) {
						m.setEtat(Etat.Termine);
						if (!m.isTirsAuButs()) {
							if (m.nbButEquipe1() > m.nbButEquipe2())
								m.setIdEquipeGagnante(m.getEquipe1()
										.getIdEquipe());
							else if (m.nbButEquipe2() > m.nbButEquipe1())
								m.setIdEquipeGagnante(m.getEquipe2()
										.getIdEquipe());
						}
						tournoi.setMatch(m);
						if (tournoi.isDernierTourFini()) {
							tournoi.nouveauTour();
						}
						request.setAttribute("match", m);
						request.setAttribute("arbitres",
								tournoi.getAllArbitresDisponible());
						dispatcher = request
								.getRequestDispatcher("/administration/match.jsp");
					}
				}
			}
			// Terminer un match sur tir au but
			else if (action.equals("terminerMatchTirsAuBut")) {
				if (request.getParameter("idMatch") != null) {
					Match m = tournoi.getMatch((Integer.parseInt(request
							.getParameter("idMatch"))));
					if (m != null) {
						if (request.getParameter("idEquipeGagnante") != null) {
							int idEquipeGagnante = Integer.parseInt(request
									.getParameter("idEquipeGagnante"));
							m.setEtat(Etat.Termine);
							m.setProlongations(true);
							m.setTirsAuButs(true);
							m.setIdEquipeGagnante(idEquipeGagnante);
							tournoi.setMatch(m);
							if (tournoi.isDernierTourFini()) {
								tournoi.nouveauTour();
							}
							request.setAttribute("match", m);
							request.setAttribute("arbitres",
									tournoi.getAllArbitresDisponible());
							dispatcher = request
									.getRequestDispatcher("/administration/match.jsp");
						}
					}
				}
			}
			// Ajouter un but
			else if (action.equals("ajouterButMatch")) {
				if (request.getParameter("idMatch") != null) {
					Match m = tournoi.getMatch((Integer.parseInt(request
							.getParameter("idMatch"))));
					if (m != null) {
						if (request.getParameter("idJoueur") != null
								&& request.getParameter("minute") != null) {
							Joueur joueur = tournoi
									.getJoueur((Integer.parseInt(request
											.getParameter("idJoueur"))));
							Integer minute = Integer.parseInt(request
									.getParameter("minute"));

							But but = new But();
							but.setAuteur(joueur);
							but.setMinute(minute);
							tournoi.addBut(but, m);
						}
						request.setAttribute("match", m);
						request.setAttribute("arbitres",
								tournoi.getAllArbitresDisponible());
						dispatcher = request
								.getRequestDispatcher("/administration/match.jsp");
					}
				}
			}
			// Retirer un but
			else if (action.equals("retirerButMatch")) {
				if (request.getParameter("idMatch") != null) {
					Match m = tournoi.getMatch((Integer.parseInt(request
							.getParameter("idMatch"))));
					if (m != null) {
						int idBut = Integer.parseInt(request
								.getParameter("idBut"));
						tournoi.removeBut(m, idBut);
						request.setAttribute("match", m);
						request.setAttribute("arbitres",
								tournoi.getAllArbitresDisponible());
						dispatcher = request
								.getRequestDispatcher("/administration/match.jsp");
					}
				}
			}
		}
		if (dispatcher != null) {
			dispatcher.forward(request, response);
		} else {
			request.getRequestDispatcher("/administration/login.jsp").forward(
					request, response);
		}
	}
}